package com.application.model.gobierno.caba.database;

import java.sql.SQLException;

import org.apache.commons.lang.StringEscapeUtils;

import com.application.model.database.ManagerDataBase;
import com.application.model.gobierno.caba.entities.GobCabaColegioItem;
import com.application.model.gobierno.caba.retrieve.RetrieveGobCABA;

public class GobCABADB extends ManagerDataBase {

	private RetrieveGobCABA retrieveGobCaba;
	public GobCABADB(RetrieveGobCABA retrieveColegioElegirColegio) {
		super();
		this.retrieveGobCaba = retrieveColegioElegirColegio;
	}

	public void save(GobCabaColegioItem item) {
		
		String nombreColegio = "";
		String pais = "";
		String provincia = "";
		String partido = "";
		String localidad = "";
		String direccion = "";
		
		String email = "";
		String telefono = "";
		String tipo = "";
		
		String descripcion = "";
		String detalleId = "";
		
		try {
			if(item.getSaveInDB()==null || !item.getSaveInDB()){
				nombreColegio = refactorNombre(item.getNombre());
				pais = refactorPais(item.getPais());
				provincia = refactorProvincia(item.getProvincia());				
				partido = refactorPartido(item.getPartido());
				localidad = refactorLocalidad(item.getLocalidad());				
				direccion = item.getDireccion();
				
				tipo = refactorTipo(item.getGestion());				
				email = item.getEmail();
				telefono = item.getTelefono();
				descripcion = item.getDescripcion();
				detalleId = addDetalle(nombreColegio, pais, provincia, partido,localidad,direccion,descripcion);
				addInstitucion(nombreColegio, pais, provincia, partido,localidad,direccion,tipo,email,telefono,detalleId);
				
				
				addJornada(item,nombreColegio, pais, provincia,partido,localidad,direccion);		
				addNivel(item, nombreColegio, pais, provincia,partido, localidad,direccion);			
				
				item.setSaveInDB(true);
			}
		} catch (Exception e) {
			retrieveGobCaba.saveFile();
			logger.error(e);
		}
		
	}

	private String addDetalle(String nombreColegio, String pais, String provincia, String partido, String localidad, String direccion, String descripcion) throws SQLException {
		String 		query = "";
		String 		id = "NULL";
		try{
			id = getIdQuery(getSQLDetalleId(nombreColegio,pais, provincia, partido, localidad,direccion));
			query = "INSERT INTO detalle (descripcion,id)" +
					" VALUES ( "+
					" '"+escapeValue(descripcion)+"'," +id+
//					","+
//					getSQLInstitucionId(nombreColegio, pais, provincia, partido, localidad, direccion)+
					" )" +
					" ON DUPLICATE KEY UPDATE descripcion=IFNULL(descripcion,'"+escapeValue(descripcion)+"')" +
//					"institucion_id=IFNULL(institucion_id,"+getSQLInstitucionId(nombreColegio, pais, provincia, partido, localidad, direccion)+")"+
					" ";
			logger.info(query);
			id = executeQuery(query);
		}catch (Exception e) {
			logger.error(query);
			throw new SQLException(e);
		}
		return id;
	}

	

	private String refactorTipo(String gestion) {
		String value = gestion.trim();
		if(value.equalsIgnoreCase("Estatal")){
			value="Público";
		}else if(value.equalsIgnoreCase("Privada")){
			value="Privado";
		}
		
		return value;
	}

	private String refactorNombre(String nombre) {
		String value = nombre.trim();
		value = StringEscapeUtils.unescapeXml(nombre);//escapeValue(value);
		value = StringEscapeUtils.unescapeJava(nombre);
		value = StringEscapeUtils.unescapeHtml(nombre);
		
		return value;
	}

	private String refactorLocalidad(String localidad) {
		String value = localidad.trim();
		if(value.equalsIgnoreCase("Nueva Pompeya")){
			value="Pompeya";
		}
		return value;
	}

	private String refactorPais(String pais) {
		String value = pais;
		
		return value;
	}

	private String refactorProvincia(String provincia) {
		String value = provincia;
		
		return value ;
	}

	private String refactorPartido(String partido) {
		String value = escapeValue(partido);
		
		
		
		return value;
	}

	

	
	private String getNombreBarrio(String barrio) {
		String value = "";
		if(barrio.equals("Florida Este")){
			barrio = "Florida%/Este";
		}else if(barrio.equals("Florida Oeste")){
			barrio = "Florida%/Oeste";
		}else if(barrio.equals("Florida Oste")){
			barrio = "Florida%/Oeste";
		}else if(barrio.contains("Parque")){
			String[] vector = barrio.split(" ");
			if(vector.length>1){
				barrio="P%"+vector[1]+"%";
			}
		}
		value  = escapeValue(barrio);
		return value;
	}

	private void addNivel(GobCabaColegioItem item,String nombreColegio, String pais, String provincia,String partido, String localidad,String direccion) throws SQLException {		
		String query = "";
		try{	
			if(item.getNiveles()!=null){
				for (String nivel : item.getNiveles()) {
					query="INSERT INTO nivel_institucion(nivel_id,institucion_id) "
				        + " VALUES("
				        + " (SELECT id FROM nivel WHERE UPPER(name) LIKE UPPER('%"+getNivelSQL(nivel)+"%')),"
				        + " "+getSQLInstitucionId(nombreColegio, pais, provincia, partido, localidad,direccion)
				        + ")" +
			            " ON DUPLICATE KEY UPDATE " +
						" institucion_id=IFNULL(institucion_id,"+getSQLInstitucionId(nombreColegio, pais, provincia, partido, localidad, direccion)+")"+
				        "";
					logger.info(query);
					executeQuery(query);
				}
			}
		}catch (Exception e) {
			logger.error(query);
			throw new SQLException(e);
		}
	}

	private String getNivelSQL(String escapeValue) {
		String value = "";
		value = escapeValue(escapeValue);
		if(escapeValue.contains("Infantes")){
			value = escapeValue.substring(11, escapeValue.length());
		}
		return value;
	}

	private void addJornada(GobCabaColegioItem item,String nombreColegio, String pais, String provincia,String partido,String localidad,String direccion) throws SQLException {
		String query = "";
		try{
			if(item.getJornadas()!=null){
				for (String jornada : item.getJornadas()) {
					query="INSERT INTO jornada_institucion(jornada_id,institucion_id) "
				            + "VALUES("                        
				            + " (SELECT id from jornada WHERE UPPER(name)=UPPER('"+escapeValue(jornada)+"')),"
				            + " "+getSQLInstitucionId(nombreColegio, pais, provincia, partido,localidad,direccion)
				            + ")" +
				            " ON DUPLICATE KEY UPDATE " +
							" institucion_id=IFNULL(institucion_id,"+getSQLInstitucionId(nombreColegio, pais, provincia, partido, localidad, direccion)+")"+							
				            "";
					logger.info(query);
					executeQuery(query);
				}
			}
		}catch (Exception e) {
			logger.error(query);
			throw new SQLException(e);
		}
	}

	private void addInstitucion(String nombreColegio, 
			String pais, String provincia, String partido, String localidad, String direccion, 
			String tipo, String email, String telefono,String detalleId)throws SQLException {
		String query = "";
		String id  = "";
		try{
			id = getIdQuery(getSQLInstitucionId(nombreColegio,pais, provincia, partido, localidad,direccion));
			query = "INSERT INTO institucion (name,pais_id,provincia_id,partido_id,localidad_id,barrio_id,direccion," +
					" tipo_id,email,telefono,id,detalle_id)" +
					" VALUES ('"+escapeValue(nombreColegio)+"'," +
					" "+getSQLPaisId(pais)+","+
					" "+getSQLProvinciaId(pais,provincia)+"," +
					" "+getSQLPartidoId(pais, provincia,partido)+","+
					" "+getSQLLocalidadId(pais, provincia,partido,localidad)+","+
					" "+getSQLBarrioId(pais, provincia,partido,localidad)+","+
					" '"+escapeValue(direccion)+"',"+
					" (SELECT id FROM tipo where UPPER(name) LIKE UPPER('%"+escapeValue(tipo)+"%')),"+
					" '"+escapeValue(email)+"','"+escapeValue(telefono)+"'," +id+","+detalleId+
					" )" +
					" ON DUPLICATE KEY UPDATE email='"+escapeValue(email)+"',telefono='"+escapeValue(telefono)+"'," +
						"localidad_id=IFNULL(localidad_id,"+getSQLLocalidadId(pais, provincia,partido,localidad)+"),"+
						"barrio_id=IFNULL(barrio_id,"+getSQLBarrioId(pais, provincia,partido,localidad)+")"+
					" ";
			logger.info(query);
			executeQuery(query);
		}catch (Exception e) {
			logger.error(query);
			throw new SQLException(e);
		}
	}

	private String getSQLInstitucionId(String nombreColegio,String pais,String provincia,String partido,String localidad, String direccion){
		String sql = "";
		sql ="(SELECT id FROM institucion WHERE "+getWhereColegioUpdate(pais, provincia, partido,localidad,direccion, nombreColegio)+")";
		return sql;
	}
	private String getSQLDetalleId(String nombreColegio, String pais, String provincia, String partido, String localidad, String direccion) {
		String sql = "";
		sql ="(SELECT detalle_id FROM institucion WHERE id="+getWhereColegioUpdate(nombreColegio,pais, provincia, partido,localidad,direccion)+")";
		return sql;
	}
	
	
	
	protected String getSQLPartidoId(String pais,String provincia,String partido){
		String sql = "";
		sql =" (SELECT id FROM partido where UPPER(name)=UPPER('"+getPartidoName(partido)+"') AND provincia_id IN "+getSQLProvinciaId(pais,provincia)+")";
		return sql;
	}
	public String getSQLPartidoIdFromLocalidadAndBarrio(String pais,String provincia,String partido){
		String partidoId = "";
		partidoId = " (SELECT partido_id from localidad where id IN (select localidad_id from barrio where UPPER(name) LIKE UPPER('"+getNombreBarrio(partido)+"') ) and partido_id IN (select id from partido where provincia_id IN ( "+getSQLProvinciaId(pais,provincia)+"  )))";
		return partidoId;
	}
	protected String getSQLLocalidadId(String pais,String provincia,String partido,String localidad){
		String sql = "";
		String idFromLocalidad ="";
		String idFromBarrio ="";
		idFromLocalidad ="(SELECT id FROM localidad where UPPER(name) LIKE UPPER('"+getLocalidadName(localidad)+"') AND partido_id = "+getSQLPartidoId(pais,provincia,partido)+")";
		idFromBarrio = getSQLBarrioId(pais, provincia, partido, localidad);
		sql = "IFNULL("+idFromLocalidad+","+idFromBarrio+")";
		return sql;
	}
	private String getSQLBarrioId(String pais, String provincia,String partido, String localidad) {
		String sql = "";
		sql ="(SELECT id FROM barrio where UPPER(name) LIKE UPPER('"+getBarrioName(localidad)+"') AND " +
			 " localidad_id IN (SELECT id FROM localidad WHERE partido_id IN "+getSQLPartidoId(pais, provincia, partido)+" ) "+
			 ")";
		return sql;
	}
	
	private String getBarrioName(String barrio) {
		String value = escapeValue(barrio);
		if(barrio.contains("Parque")){
			String[] vector = barrio.split(" ");
			if(vector.length>1){
				value="P%"+vector[1]+"%";
			}
		}else if(barrio.contains("Montserrat")){
			value="Monserrat";
		}else if(barrio.contains("Villa Sta. Rita")){
			value="B.Santa Rita";			
		}else if(barrio.contains("Montecastro")){
			value="Monte castro";			
		}else if(barrio.contains("San")){
			String[] vector = barrio.split(" ");
			if(vector.length>1){
				String auxiliar = "";
				value="S%";
				for (int i = 1; i < vector.length; i++) {
					auxiliar = vector[i];
					if(auxiliar.equalsIgnoreCase("Nicolás")){
						auxiliar = "Nicolas";
					}
					value+=auxiliar+"%";
				}								
			}
		}
		value = escapeValue(value);
		return value;
	}

	private String getPartidoName(String partido) {
		String value = escapeValue(partido);
		value = getLocalidadName(value);
		return value;
	}

	private String getLocalidadName(String localidad) {
		String value = escapeValue(localidad);
		if(localidad.equalsIgnoreCase("Villa Urquiza")){
			value = "V%Urquiza";
			
		}else if(localidad.equalsIgnoreCase("Rincón")){
			value = "%Rinc%";
		}else if(localidad.equalsIgnoreCase("Versalles")){
			value = "Versailles";
			
		}else if(localidad.equalsIgnoreCase("San Cristóbal")){
			value = "%S%Crist%";
		}else if(localidad.equalsIgnoreCase("Parque Chacabuco")){
			value = "%P%Chacabuco%";
		}else if(localidad.contains("Villa")){
			String[] vector = localidad.split(" ");
			if(vector.length>1){
				String auxiliar = "";
				value="V%";
				for (int i = 1; i < vector.length; i++) {
					auxiliar = vector[i];
					if(auxiliar.equalsIgnoreCase("Del")){
						auxiliar = "";
					}
					value+=auxiliar+"%";
				}								
			}
		}else if(localidad.contains("San")){
			String[] vector = localidad.split(" ");
			if(vector.length>1){
				String auxiliar = "";
				value="S%";
				for (int i = 1; i < vector.length; i++) {
					auxiliar = vector[i];
					if(auxiliar.equalsIgnoreCase("Nicolás")){
						auxiliar = "Nicolas";
					}
					value+=auxiliar+"%";
				}								
			}
		}else if(localidad.contains("Parque")){
			String[] vector = localidad.split(" ");
			if(vector.length>1){
				value="P%"+vector[1]+"%";
			}
		}
		
		return value;
	}
	
	
	protected String getWhereColegioUpdate(String pais,String provincia,String partido,String localidad,String direccion, String nombreColegio){
		String where ="";		
			
		where = " ( name='"+escapeValue(nombreColegio)+"' OR direccion='"+escapeValue(direccion)+"' ) AND " +		
		" pais_id= "+getSQLPaisId(pais)+" AND " +
		" provincia_id= "+getSQLProvinciaId(pais, provincia)+" AND " +
		" partido_id= "+getSQLPartidoId(pais,provincia,partido)+" AND" +
		" localidad_id = "+getSQLLocalidadId(pais,provincia,partido,localidad)+ " AND " +
		" (barrio_id = "+getSQLBarrioId(pais,provincia,partido,localidad)+" OR barrio_id IS NULL ) "+
		"";
					
		return where;
	}
	
}
